
#include <stdio.h>
#include <stdint.h>
#include "main.h"
#include "i2c.h"

// 0 0 0 0 0 0 SA0 R/W#
#define LED_DEVICE_ADDR (0x78)

// Co D/C 0 0 0 0 0 0
#define LED_DEVICE_WCMD (0x00) // ?????????????????

#define I2C1_SENDTIMEOUT 10

void ssd1306_init(void)
{
  uint8_t pdata[] = {0xae,       // ????
                     0x20, 0x02, // ????????
                     0x00, 0x10, // ????
                     0x40,       // ????????
                     0x81, 0x7f, // ??????
                     0xa0,       // ??????
                     0xc0,       // ??????
                     0xa8, 0x3f, // ??????
                     0xd3, 0x00, // ????
                     0xd5, 0x80, // ????????,??????
                     0xd9, 0xf1, // ????????
                     0xda, 0x12, // ??COM??????
                     0xdb, 0x20, // ??VCOMH??????
                     0x8d, 0x14, // ??????
                     0xa4,       // ??????,??\????????
                     0xa6,       // ???\???? "0??1??"????"0??1??"

                     //
                     //  0x26, // ??\??????
                     //  0x00, // ????
                     //  0x00, // ??????
                     //  0x07, // ???????
                     //  0x07, // ??????
                     //  0x00, // ????
                     //  0xFF, // ????
                     //  0x2f, // ????

                     //
                     0xaf}; // ????
  int len = sizeof(pdata) / sizeof(pdata[0]);
  if (HAL_I2C_Mem_Write(&hi2c2, LED_DEVICE_ADDR, 0, 0, pdata, len, I2C1_SENDTIMEOUT) != HAL_OK)
  {
    printf("ssd1306 mem write error \n");
    return;
  }
}

void ssd1306_clear(void)
{
  // vTaskDelay(50 / portTICK_PERIOD_MS);

  uint8_t data[] = {0xb0,  // ????????
                    0x00,  // ??????????????
                    0x10}; // ??????????????

  uint8_t pdata[128] = {0xff}; // ????
  int ret = 0,
      plen = sizeof(pdata) / sizeof(pdata[0]);
  // printf("len %d\n", len);
  for (int i = 0; i < 8; i++)
  {
    //???????ssd1306 ?????????
    ret = HAL_I2C_Mem_Write(&hi2c2, LED_DEVICE_ADDR, 0, 0, data, 3, I2C1_SENDTIMEOUT);

    //????????
    ret = HAL_I2C_Mem_Write(&hi2c2, LED_DEVICE_ADDR, 0x40, 1, pdata, plen, I2C1_SENDTIMEOUT);
    if (ret != 0)
    {
      printf("error 5\n");
    }
    data[0] += 1; // ???b0~b7
  }
}
